package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;
import java.util.Vector;

import vista.calendarioModelo;
import vista.calendariofV;
import vista.equipoV;
import vista.generarjuegoV;


import modelo.Marbitro;
import modelo.Mequipo;
import modelo.Mjugador;
import modelo.Mpartido;
import modelo.Mtemporada;
import modelo.TablaEquipos;


public class generarC implements ActionListener {
	Mpartido mpartido;
	int a=0;
	long codpar = 0;
	private generarjuegoV vgen;
	private Mtemporada mt;
	int con = 0;
    int conv=0;
	public generarC(Mtemporada mt) {
		super();
		this.vgen = new generarjuegoV();
		this.vgen.setLocation(160, 20);
		this.vgen.setVisible(true);
		this.vgen.addListener(this);
		this.mt=mt;
		System.out.println(mt.getVarbitro().isEmpty());
		
		// TODO Auto-generated constructor stub
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String actionComand = e.getActionCommand();
		if (actionComand.equals("Generar")) {
			if(mt.getVarbitro().size()>0 && mt.getVequipo().size()>0){
			while(a<1){
			generarJuegos();
			mt.imprimirgenerarjuego();
			a++;
			}
			actualizarDiftabla();
			
			// TODO Auto-generated method stub
		}
			else{
				vgen.mensaje("Debe Registrar los Arbitros y los Equipos primero");
			}
		}
		if (actionComand.equals("Salir")) {
			vgen.setVisible(false);
		}
	}

	public void generarJuegos() {
		Vector<Mequipo> vequi = new Vector<Mequipo>();
		vequi.addAll(mt.getVequipo());
		int contador;
		int contador2;
		Calendar ahoraCal = Calendar.getInstance();
		System.out.println("fecha: " + ahoraCal.getTime());
		String anno = String.valueOf(ahoraCal.get(Calendar.YEAR));
		String mes = String.valueOf(ahoraCal.get(Calendar.MONTH) + 1);
		String dia;
		String fechap;
		int cah;
		int cav;
		int hrch;
		int hrcv;
		int impulsarvis;
		int homerumvis;
		int impulsarcasa;
		int homerumcasa;
		for (int i = 0; i < vequi.size(); i++) {
			contador=0;
			   while(contador<2){
				for (int j = i+1; j < vequi.size(); j++) {
					
					cah = mt.aleatorioCarrerashome();
					cav = mt.aleatorioCarrerasvisi();
					hrch = (int) (Math.floor(Math.random() * 2))+1;
					hrcv = (int) (Math.floor(Math.random() * 2))+1;
					// **************************asiganar codigo del
					// partido*************
					mpartido = new Mpartido();
					mpartido.setCodpar(codpar);
					codpar = mpartido.getCodpar();
					codpar++;
					// ***************************asignar equipo
					// casa*******************
					mpartido.setHomec(vequi.get(i).getNomequipo());
					String homec = mpartido.getHomec();
					mt.getVequipo().get(i).actualizarJj();
					// ********************asignar equipo
					// visitante*************************
					mpartido.setVisitante(vequi.get(j).getNomequipo());
					String visitante = mpartido.getVisitante();
					mt.getVequipo().get(j).actualizarJj();

					// ***************************asignar
					// Umpire***************************
					mpartido.setUmpire(mt.getVarbitro().get(
							mt.aleatorioarbitro()).getNombre());
					String umpire = mpartido.getUmpire();
							// **********************asignar homerrums y
							// carreras Home***************
							if (cah == 0) {
								mpartido.setImpulsarcasa(0);
								mpartido.setHomerumcasa(0);

							} else
			
								while (hrch > cah){
									
									cah = mt.aleatorioCarrerashome();
									
								}
									if (hrch < cah) {
										int impc = cah - hrch;
										mpartido.setImpulsarcasa(impc);
										mpartido.setHomerumcasa(hrch);

									} else if (hrch == cah) {
										mpartido.setHomerumcasa(hrch);
										mpartido.setImpulsarcasa(0);

									}
							
							// ****************Asignar homerrums al jugador de
							// casa**************
							if (hrch >= 1) {
								int asignar = mt.asignarHomerrum();
								//System.out.println(mt.getVequipo().size());
								mt.getVequipo().get(i).getVjuga().get(asignar)
										.setHomerum(hrch);
								mt.getVequipo().get(i).getVjuga().get(asignar).actualizarHomerruns(hrch);
										
							}

							// ****************Asignar Carreras y homerrums
							// visitantes*******
							if (cav == 0) {
								mpartido.setImpulsarvis(0);
								mpartido.setHomerumvis(0);

							} else {
								
									while (hrcv > cav){
										
										cav = mt.aleatorioCarrerasvisi();
										
									}
									if (hrcv < cav) {
										int impv = cav - hrcv;
										mpartido.setImpulsarvis(impv);
										mpartido.setHomerumvis(hrcv);

									} else if (hrcv == cav) {
										mpartido.setHomerumvis(hrcv);
										mpartido.setImpulsarvis(0);

									} else {
										cav = mt.aleatorioCarrerasvisi();
									}
								

								// *************Asignar homerrums al jugador de
								// visitante*********
								if (hrcv > 1) {
									int asignar = mt.asignarHomerrum();
									//System.out.println(i);
									//System.out.println(asignar);
									mt.getVequipo().get(j).getVjuga().get(asignar)
											.setHomerum(hrcv);
									mt.getVequipo().get(j).getVjuga().get(asignar).actualizarHomerruns(hrcv);
											
								}
							}
							// ****************************extrainings**************************
							if (cav == cah) {
								int cahextra;
								int cavextra;
								
								do {
									cahextra = mt.aleatorioCarrerashome();
									cavextra = mt.aleatorioCarrerasvisi();
									int anotadash = cah + cahextra;
									int anotadasv = cav + cavextra;
									con++;
								} while (cahextra == cavextra);
								

								// ******************extrainings
								// home*********************************
								int imph = ((cah + cahextra) - hrch);
								mpartido.setImpulsarcasa(imph);
								mpartido.setHomerumcasa(hrch);

								// *******************extrainings
								// visitante****************************
								int impv = ((cav + cavextra) - hrcv);
								mpartido.setImpulsarvis(impv);
								mpartido.setHomerumvis(hrcv);
								
							}
					   mpartido.setInings(con+9);
						int inings = mpartido.getInings();
						impulsarvis = mpartido.getImpulsarvis();
						homerumvis = mpartido.getHomerumvis();
						impulsarcasa = mpartido.getImpulsarcasa();
						homerumcasa = mpartido.getHomerumcasa();
						
						if (impulsarvis >= 1) {
							int asignar = mt.asignarCarrerasI();
							mt.getVequipo().get(j).getVjuga().get(asignar).actualizarCari(impulsarvis);		
						}
						
						if (impulsarcasa >= 1) {
							int asignar = mt.asignarCarrerasI();
							mt.getVequipo().get(i).getVjuga().get(asignar).actualizarCari(impulsarcasa);		
						}
						
                         if((homerumcasa+ impulsarcasa)>(homerumvis + impulsarvis)){
                        	 mt.getVequipo().get(i).actualizarJg();
                        	 mt.getVequipo().get(j).actualizarJp();
                         }
                         else{
                        	 mt.getVequipo().get(i).actualizarJp();
                        	 mt.getVequipo().get(j).actualizarJg();
                         }
						String visita = String.valueOf(homerumvis + impulsarvis);
						String casa = String.valueOf(homerumcasa+ impulsarcasa);
						String marcador = casa +"-"+visita;
						
						if (i == 0)
							ahoraCal.add(Calendar.DATE, 1);
						else if (i == 1)
							ahoraCal.add(Calendar.DATE, -1);
						else if (i == 2) {
							ahoraCal.add(Calendar.DATE, -2);
						}
						dia = String.valueOf(ahoraCal.get(Calendar.DATE));
						
						fechap = anno + "/" + mes + "/" + dia;
						
						// ********asignar Umpire******************
						mpartido.setUmpire(mt.getVarbitro().get(mt.aleatorioarbitro()).getNombre());
					        umpire = mpartido.getUmpire();
						for (int pos= 0; pos<mt.getPartido().size(); pos++) {
							
							if (mt.getPartido().get(pos).getFechap().equals(fechap)
									&& mt.getPartido().get(pos).getUmpire()
											.equals(umpire)) {
								while (mt.getPartido().get(pos).getUmpire()
										.equals(umpire)) {
									mpartido.setUmpire(mt.getVarbitro().get(
											mt.aleatorioarbitro())
											.getNombre());
									umpire = mpartido.getUmpire();
								}
							
							}
						}
						for(int arbi=0;arbi<mt.getVarbitro().size();arbi++){
						if(mt.getVarbitro().get(arbi).getNombre().equals(umpire)){
							mt.getVarbitro().get(arbi).actualizarCanjuegos();
						}
						}
						mpartido = new Mpartido(codpar, fechap, homec,
								visitante, umpire, inings, impulsarcasa,
								impulsarvis, homerumcasa, homerumvis, marcador);
							mt.agregarPartido(mpartido);
							
							
					}//2do for
					contador++;
				} // while
			   
           ahoraCal.add(Calendar.DATE, 1);
			}// 1er for
	
		//************************ciclo Visitante-casa*****************
		
		for (int ii = 0; ii < vequi.size(); ii++) {
			contador2=0;
			   while(contador2<2){
				for (int jj = ii+1; jj < vequi.size(); jj++) {
					
					cah = mt.aleatorioCarrerashome();
					cav = mt.aleatorioCarrerasvisi();
					hrch = (int) (Math.floor(Math.random() * 2))+1;
					hrcv = (int) (Math.floor(Math.random() * 2))+1;
					// **************************asiganar codigo del
					// partido*************
					mpartido = new Mpartido();
					mpartido.setCodpar(codpar);
					codpar = mpartido.getCodpar();
					codpar++;
					// ***************************asignar equipo
					// visitante*******************
					mpartido.setVisitante(vequi.get(ii).getNomequipo());
					String visitante = mpartido.getVisitante();
					mt.getVequipo().get(ii).actualizarJj();
					// ********************asignar equipo
					// casa*************************
					mpartido.setHomec(vequi.get(jj).getNomequipo());
					String homec = mpartido.getHomec();
					mt.getVequipo().get(jj).actualizarJj();

					// ***************************asignar
					// Umpire***************************
					mpartido.setUmpire(mt.getVarbitro().get(
							mt.aleatorioarbitro()).getNombre());
					String umpire = mpartido.getUmpire();
							// **********************asignar homerrums y
							// carreras Home***************
							if (cah == 0) {
								mpartido.setImpulsarcasa(0);
								mpartido.setHomerumcasa(0);

							} else
			
								while (hrch > cah){
									
									cah = mt.aleatorioCarrerashome();
									
								}
									if (hrch < cah) {
										int impc = cah - hrch;
										mpartido.setImpulsarcasa(impc);
										mpartido.setHomerumcasa(hrch);

									} else if (hrch == cah) {
										mpartido.setHomerumcasa(hrch);
										mpartido.setImpulsarcasa(0);

									}
							
							// ****************Asignar homerrums al jugador de
							// casa**************
							if (hrch >= 1) {
								int asignar = mt.asignarHomerrum();
								//System.out.println(mt.getVequipo().size());
								mt.getVequipo().get(jj).getVjuga().get(asignar)
										.setHomerum(hrch);
								mt.getVequipo().get(jj).getVjuga().get(asignar).actualizarHomerruns(hrch);
										
							}

							// ****************Asignar Carreras y homerrums
							// visitantes*******
							if (cav == 0) {
								mpartido.setImpulsarvis(0);
								mpartido.setHomerumvis(0);

							} else {
								
									while (hrcv > cav){
										
										cav = mt.aleatorioCarrerasvisi();
										
									}
									if (hrcv < cav) {
										int impv = cav - hrcv;
										mpartido.setImpulsarvis(impv);
										mpartido.setHomerumvis(hrcv);

									} else if (hrcv == cav) {
										mpartido.setHomerumvis(hrcv);
										mpartido.setImpulsarvis(0);

									} else {
										cav = mt.aleatorioCarrerasvisi();
									}
								

								// *************Asignar homerrums al jugador de
								// visitante*********
								if (hrcv > 1) {
									int asignar = mt.asignarHomerrum();
									//System.out.println(i);
									//System.out.println(asignar);
									mt.getVequipo().get(ii).getVjuga().get(asignar)
											.setHomerum(hrcv);
									mt.getVequipo().get(ii).getVjuga().get(asignar).actualizarHomerruns(hrcv);
											
								}
							}
							// ****************************extrainings**************************
							if (cav == cah) {
								int cahextra;
								int cavextra;
								
								do {
									cahextra = mt.aleatorioCarrerashome();
									cavextra = mt.aleatorioCarrerasvisi();
									int anotadash = cah + cahextra;
									int anotadasv = cav + cavextra;
									conv++;
								} while (cahextra == cavextra);
								

								// ******************extrainings
								// home*********************************
								int imph = ((cah + cahextra) - hrch);
								mpartido.setImpulsarcasa(imph);
								mpartido.setHomerumcasa(hrch);

								// *******************extrainings
								// visitante****************************
								int impv = ((cav + cavextra) - hrcv);
								mpartido.setImpulsarvis(impv);
								mpartido.setHomerumvis(hrcv);
								
							}
					   mpartido.setInings(conv+9);
						int inings = mpartido.getInings();
						impulsarvis = mpartido.getImpulsarvis();
						homerumvis = mpartido.getHomerumvis();
						impulsarcasa = mpartido.getImpulsarcasa();
						homerumcasa = mpartido.getHomerumcasa();
						if (impulsarvis >= 1) {
							int asignar = mt.asignarCarrerasI();
							mt.getVequipo().get(ii).getVjuga().get(asignar).actualizarCari(impulsarvis);		
						}
						
						if (impulsarcasa >= 1) {
							int asignar = mt.asignarCarrerasI();
							mt.getVequipo().get(jj).getVjuga().get(asignar).actualizarCari(impulsarcasa);		
						}
						
						if((homerumcasa+ impulsarcasa)>(homerumvis + impulsarvis)){
                       	 mt.getVequipo().get(jj).actualizarJg();
                       	 mt.getVequipo().get(ii).actualizarJp();
                        }
                        else{
                       	 mt.getVequipo().get(jj).actualizarJp();
                       	 mt.getVequipo().get(ii).actualizarJg();
                        }
						
						String visita = String.valueOf(homerumvis + impulsarvis);
						String casa = String.valueOf(homerumcasa+ impulsarcasa);
						String marcador = casa +"-"+visita;
						if (ii == 0)
							ahoraCal.add(Calendar.DATE, 1);
						else if (ii == 1)
							ahoraCal.add(Calendar.DATE, -1);
						else if (ii == 2) {
							ahoraCal.add(Calendar.DATE, -2);
						}
						dia = String.valueOf(ahoraCal.get(Calendar.DATE));
						
						fechap = anno + "/" + mes + "/" + dia;
						
						// ********asignar Umpire******************
						mpartido.setUmpire(mt.getVarbitro().get(mt.aleatorioarbitro()).getNombre());
					        umpire = mpartido.getUmpire();
						for (int pos= 0; pos<mt.getPartido().size(); pos++) {
							
							if (mt.getPartido().get(pos).getFechap().equals(fechap)
									&& mt.getPartido().get(pos).getUmpire()
											.equals(umpire)) {
								while (mt.getPartido().get(pos).getUmpire()
										.equals(umpire)) {
									mpartido.setUmpire(mt.getVarbitro().get(
											mt.aleatorioarbitro())
											.getNombre());
									umpire = mpartido.getUmpire();
								}
							
							}
						}
						for(int arbi2=0;arbi2<mt.getVarbitro().size();arbi2++){
							if(mt.getVarbitro().get(arbi2).getNombre().equals(umpire)){
								mt.getVarbitro().get(arbi2).actualizarCanjuegos();
							}
							}
						mpartido = new Mpartido(codpar, fechap, homec,
								visitante, umpire, inings, impulsarcasa,
								impulsarvis, homerumcasa, homerumvis, marcador);
							mt.agregarPartido(mpartido);
							
							
					}//2do for
					contador2++;
				} // while
			   
           ahoraCal.add(Calendar.DATE, 1);
			}// 1er for
		}//fin del metodo
	
public void actualizarDiftabla(){
	for(int a=0;a<mt.getVequipo().size();a++){
		mt.getVequipo().get(a).calcularDif(mt);
	}
	
}

}